package service

import (
	"MyBlogv2/common/HttpCode"
	"MyBlogv2/common/neo4jUtil"
	"MyBlogv2/common/response"
	"log"
	"strconv"

	"github.com/gin-gonic/gin"
)

// GetGraphOverview 获取图谱概览数据
func GetGraphOverview(c *gin.Context) {
	// 获取查询参数
	limitStr := c.DefaultQuery("limit", "100")
	limit, err := strconv.Atoi(limitStr)
	if err != nil || limit <= 0 || limit > 500 {
		limit = 100
	}

	nodeType := c.DefaultQuery("type", "")
	depthStr := c.DefaultQuery("depth", "1")
	depth, err := strconv.Atoi(depthStr)
	if err != nil || depth < 1 || depth > 3 {
		depth = 1
	}

	// 调用Neo4j查询
	graphData, err := neo4jUtil.GetGraphOverview(limit, nodeType, depth)
	if err != nil {
		log.Printf("获取图谱概览失败: %v", err)
		response.ResponseError(c, HttpCode.FAILURE)
		return
	}

	response.ResponseOK(c, graphData)
}

// GetGraphNodes 获取节点列表（分页、过滤、搜索）
func GetGraphNodes(c *gin.Context) {
	// 获取分页参数
	pageStr := c.DefaultQuery("page", "1")
	page, err := strconv.Atoi(pageStr)
	if err != nil || page < 1 {
		page = 1
	}

	sizeStr := c.DefaultQuery("size", "20")
	size, err := strconv.Atoi(sizeStr)
	if err != nil || size < 1 || size > 100 {
		size = 20
	}

	// 获取过滤参数
	nodeType := c.DefaultQuery("type", "")
	keyword := c.DefaultQuery("keyword", "")
	sortField := c.DefaultQuery("sort", "")
	sortOrder := c.DefaultQuery("order", "desc")

	// 验证节点类型
	validTypes := map[string]bool{
		"":         true,
		"User":     true,
		"Article":  true,
		"Category": true,
		"Tag":      true,
	}
	if !validTypes[nodeType] {
		response.ResponseErrorWithMsg(c, HttpCode.FAILURE, "无效的节点类型")
		return
	}

	// 调用Neo4j查询
	result, err := neo4jUtil.GetGraphNodes(page, size, nodeType, keyword, sortField, sortOrder)
	if err != nil {
		log.Printf("获取节点列表失败: %v", err)
		response.ResponseError(c, HttpCode.FAILURE)
		return
	}

	response.ResponseOK(c, result)
}

// // GetGraphNodeDetail 获取单个节点详情
// func GetGraphNodeDetail(c *gin.Context) {
// 	nodeId := c.Param("id")
// 	if nodeId == "" {
// 		response.ResponseErrorWithMsg(c, HttpCode.FAILURE, "节点ID不能为空")
// 		return
// 	}

// 	// TODO: 实现节点详情查询
// 	response.ResponseOK(c, map[string]interface{}{
// 		"message": "节点详情接口待实现",
// 		"nodeId":  nodeId,
// 	})
// }

// // GetGraphNodeNeighbors 获取节点邻居
// func GetGraphNodeNeighbors(c *gin.Context) {
// 	nodeId := c.Param("id")
// 	if nodeId == "" {
// 		response.ResponseErrorWithMsg(c, HttpCode.FAILURE, "节点ID不能为空")
// 		return
// 	}

// 	depthStr := c.DefaultQuery("depth", "1")
// 	depth, err := strconv.Atoi(depthStr)
// 	if err != nil || depth < 1 || depth > 2 {
// 		depth = 1
// 	}

// 	nodeType := c.DefaultQuery("type", "")
// 	relationship := c.DefaultQuery("relationship", "")
// 	limitStr := c.DefaultQuery("limit", "20")
// 	limit, err := strconv.Atoi(limitStr)
// 	if err != nil || limit < 1 || limit > 100 {
// 		limit = 20
// 	}

// 	// TODO: 实现邻居查询
// 	response.ResponseOK(c, map[string]interface{}{
// 		"message":      "节点邻居接口待实现",
// 		"nodeId":       nodeId,
// 		"depth":        depth,
// 		"type":         nodeType,
// 		"relationship": relationship,
// 		"limit":        limit,
// 	})
// }

// // SearchGraphNodes 搜索节点
// func SearchGraphNodes(c *gin.Context) {
// 	query := c.DefaultQuery("q", "")
// 	if query == "" {
// 		response.ResponseErrorWithMsg(c, HttpCode.FAILURE, "搜索关键词不能为空")
// 		return
// 	}

// 	nodeType := c.DefaultQuery("type", "")
// 	categoryStr := c.DefaultQuery("category", "")

// 	// TODO: 实现节点搜索
// 	response.ResponseOK(c, map[string]interface{}{
// 		"message":  "节点搜索接口待实现",
// 		"query":    query,
// 		"type":     nodeType,
// 		"category": categoryStr,
// 	})
// }

// // GetGraphStats 获取图谱统计数据
// func GetGraphStats(c *gin.Context) {
// 	statsType := c.DefaultQuery("type", "overview")

// 	// TODO: 实现统计分析
// 	response.ResponseOK(c, map[string]interface{}{
// 		"message": "统计分析接口待实现",
// 		"type":    statsType,
// 	})
// }

// ExecuteGraphQuery 执行自定义Cypher查询
func ExecuteGraphQuery(c *gin.Context) {
	var requestBody struct {
		Query string `json:"query" binding:"required"`
	}

	if err := c.ShouldBindJSON(&requestBody); err != nil {
		response.ResponseErrorWithMsg(c, HttpCode.FAILURE, "请求参数错误: "+err.Error())
		return
	}

	// 验证查询语句
	if requestBody.Query == "" {
		response.ResponseErrorWithMsg(c, HttpCode.FAILURE, "查询语句不能为空")
		return
	}

	// 执行查询
	results, err := neo4jUtil.ExecuteQuery(requestBody.Query)
	if err != nil {
		log.Printf("执行图谱查询失败: %v", err)
		response.ResponseErrorWithMsg(c, HttpCode.FAILURE, "查询执行失败: "+err.Error())
		return
	}

	response.ResponseOK(c, map[string]interface{}{
		"records": results,
		"count":   len(results),
	})
}
